package jm.nj.demo05mian.demo02;
/*
* throw关键字:
* 作用:可以使用throw抛出异常对象
* 
*   格式:
*           throw new xxxException(参数);
* 
* 注意事项:
*       1.throw关键字必须写在方法的类部
*       2.throw后面抛出异常对象必须是Exception或者是Exception的子类
* 
*   thorws关键字:异常处理的第一种方式
*       作用:申明方法内部出现异常,告知调用者,我的方法的内部有异常,你使用的时候需要注意
* 
* 格式:写在方法的声明边上
*   修饰符 返回值类型 方法名(参数列表)throws是方法内抛出的异常类名,方法内部内部抛出的异常类名...{
*               throw new Exception("传递的数组是空的");
*               throw new Exception("传递的索引不在数组范围内");
*   }
* 
* 注意:
*       1.throws必须写在方法的声明
*       2.throws后边的声明的异常必须是Exception或者Exception的子类,通常是方法内部抛出是什么异常就声明什么异常
*       3.如果方法抛出了多个异常,需要声明多个异常
*       4.调用了一个抛出编译异常的方法,调用者就必须处理,不处理,就编译失败
* */
public class Demo03Throw {
    public static void main(String[] args) throws Exception {
        /*
        * 调用了一个声明了异常的方法,有两种处理方式
        * 1.我不处理,交给别人处理.使用throw在方法的声明上继续抛出
        * 2.方法内部消化,处理异常,使用try...catch
        * */
      //  int[] arr = null;
        int[] arr = new int[3];
        int element = getElement(2,arr);
        System.out.println(element);
    }


    /*
    * 需要在方法中对传递过来的参数进行合法性判断
    * 如果数据不合法,则以抛出异常的方式告知方法的调用者
    * 传递的参数有问题
    * */
    private static int getElement(int index, int[] arr) throws Exception {
        /*
        * 对传递进来的数组进行合法性判断,如果数组传递的是null
        * 则抛出异常,告知调用者,传递的是数组是空的
        * 使用关键字throw
        * */
        if(arr == null){
            throw new Exception("传递的数组是空");
        }
        /*
        * 对传递出来的参数index,进行合法性判断
        * 如果index不在数组的索引范围
        * 则抛出异常,告知调用者,专递的索引不在数组范围内
        * 使用关键字throw
        * */
        if(index<0 || index>arr.length-1){
            throw new Exception("传递的索引不在数组范围内");
        }
        return arr[index];
    }
}
